/**
 * 物业公司管理API接口
 * 
 * @author Wu.Liang
 * @since 2025-06-29
 */

import api from '../request'
import type { ApiResponse } from '@/types'
import type { 
  PropertyCompany, 
  PropertyCompanyQueryParams, 
  PropertyCompanyFormData, 
  PropertyCompanyAuditData,
  PropertyCompanyStats,
  PropertyCompanyListResponse,
  PropertyCompanyDetailResponse,
  PropertyCompanyStatsResponse
} from '@/types/property'

/**
 * 物业公司管理API
 */
export const propertyCompanyApi = {
  /**
   * 分页查询物业公司列表
   * @param params 查询参数
   * @returns 分页结果
   */
  getPropertyCompanyList: (params: PropertyCompanyQueryParams) => {
    return api.get<PropertyCompanyListResponse>('/api/property/companies', { params })
  },

  /**
   * 获取物业公司详情
   * @param id 物业公司ID
   * @returns 物业公司详情
   */
  getPropertyCompany: (id: number) => {
    return api.get<PropertyCompanyDetailResponse>(`/api/property/companies/${id}`)
  },

  /**
   * 根据公司编码获取物业公司详情
   * @param companyCode 公司编码
   * @returns 物业公司详情
   */
  getByCompanyCode: (companyCode: string) => {
    return api.get<PropertyCompanyDetailResponse>(`/api/property/companies/by-code/${companyCode}`)
  },

  /**
   * 新增物业公司
   * @param data 物业公司信息
   * @returns 操作结果
   */
  createPropertyCompany: (data: PropertyCompanyFormData) => {
    return api.post<ApiResponse<null>>('/api/property/companies', data)
  },

  /**
   * 更新物业公司信息
   * @param id 物业公司ID
   * @param data 物业公司信息
   * @returns 操作结果
   */
  updatePropertyCompany: (id: number, data: Partial<PropertyCompanyFormData>) => {
    return api.put<ApiResponse<null>>(`/api/property/companies/${id}`, data)
  },

  /**
   * 删除物业公司
   * @param id 物业公司ID
   * @returns 操作结果
   */
  deletePropertyCompany: (id: number) => {
    return api.delete<ApiResponse<null>>(`/api/property/companies/${id}`)
  },

  /**
   * 审核物业公司
   * @param id 物业公司ID
   * @param data 审核信息
   * @returns 操作结果
   */
  auditPropertyCompany: (id: number, data: PropertyCompanyAuditData) => {
    return api.post<ApiResponse<null>>(`/api/property/companies/${id}/audit`, data)
  },

  /**
   * 获取当前用户的物业公司信息
   * @returns 物业公司信息
   */
  getCurrentUserPropertyCompany: () => {
    return api.get<PropertyCompanyDetailResponse>('/api/property/companies/current-user')
  },

  /**
   * 物业公司注册
   * @param data 物业公司注册信息
   * @returns 操作结果
   */
  registerPropertyCompany: (data: PropertyCompanyFormData) => {
    return api.post<ApiResponse<null>>('/api/property/companies/register', data)
  },

  /**
   * 更新当前用户的物业公司信息
   * @param data 物业公司信息
   * @returns 操作结果
   */
  updateCurrentUserPropertyCompany: (data: Partial<PropertyCompanyFormData>) => {
    return api.put<ApiResponse<null>>('/api/property/companies/current-user', data)
  },

  /**
   * 检查公司编码是否存在
   * @param companyCode 公司编码
   * @param excludeId 排除的ID（编辑时使用）
   * @returns 是否存在
   */
  checkCompanyCodeExists: (companyCode: string, excludeId?: number) => {
    const params = excludeId ? { excludeId } : {}
    return api.get<ApiResponse<boolean>>(`/api/property/companies/check-code/${companyCode}`, { params })
  },

  /**
   * 获取物业公司统计信息
   * @returns 统计信息
   */
  getPropertyCompanyStats: () => {
    return api.get<PropertyCompanyStatsResponse>('/api/property/companies/stats')
  },

  /**
   * 获取物业公司详情统计信息
   * @param propertyCompanyId 物业公司ID
   * @returns 统计信息
   */
  getPropertyCompanyDetailStats: (propertyCompanyId: number) => {
    return api.get<ApiResponse<any>>(`/api/property/companies/${propertyCompanyId}/detail-stats`)
  },

  /**
   * 批量删除物业公司
   * @param ids 物业公司ID数组
   * @returns 操作结果
   */
  batchDeletePropertyCompany: (ids: number[]) => {
    return api.delete<ApiResponse<null>>('/api/property/companies/batch', { data: ids })
  },

  /**
   * 获取物业公司列表（用于下拉选择）
   * @returns 物业公司列表
   */
  getPropertyCompanyListForSelect: () => {
    return api.get<ApiResponse<PropertyCompany[]>>('/api/property/companies/list')
  },

  /**
   * 为物业公司分配小区
   * @param propertyCompanyId 物业公司ID
   * @param communityIds 小区ID列表
   * @returns 操作结果
   */
  assignCommunitiesToPropertyCompany: (propertyCompanyId: number, communityIds: number[]) => {
    return api.post<ApiResponse<string>>(`/api/property/companies/${propertyCompanyId}/assign-communities`, communityIds)
  },

  /**
   * 获取物业公司已分配的小区列表
   * @param propertyCompanyId 物业公司ID
   * @param searchKeyword 搜索关键词（可选）
   * @returns 小区列表
   */
  getAssignedCommunities: (propertyCompanyId: number, searchKeyword?: string) => {
    const params = searchKeyword ? { searchKeyword } : {}
    return api.get<ApiResponse<any[]>>(`/api/property/companies/${propertyCompanyId}/assigned-communities`, { params })
  },

  /**
   * 获取可分配的小区列表
   * @param propertyCompanyId 物业公司ID
   * @param searchKeyword 搜索关键词（可选）
   * @returns 可分配的小区列表
   */
  getAvailableCommunities: (propertyCompanyId: number, searchKeyword?: string) => {
    const params = searchKeyword ? { searchKeyword } : {}
    return api.get<ApiResponse<any[]>>(`/api/property/companies/${propertyCompanyId}/available-communities`, { params })
  },

  /**
   * 批量移除物业公司与小区的关联
   * @param propertyCompanyId 物业公司ID
   * @param communityIds 小区ID列表
   * @returns 操作结果
   */
  batchRemovePropertyCompanyCommunities: (propertyCompanyId: number, communityIds: number[]) => {
    return api.delete<ApiResponse<string>>(`/api/property/companies/${propertyCompanyId}/communities`, { data: communityIds })
  },

  /**
   * 为物业公司分配小区
   * @param data 分配数据
   * @returns 操作结果
   */
  assignCommunities: (data: { propertyCompanyId: number; communityIds: number[] }) => {
    return api.post<ApiResponse<string>>(`/api/property/companies/${data.propertyCompanyId}/assign-communities`, data.communityIds)
  },

  /**
   * 取消物业公司小区分配
   * @param data 取消分配数据
   * @returns 操作结果
   */
  unassignCommunities: (data: { propertyCompanyId: number; communityIds: number[] }) => {
    return api.delete<ApiResponse<string>>(`/api/property/companies/${data.propertyCompanyId}/communities`, { data: data.communityIds })
  },

  /**
   * 为物业公司分配用户
   * @param data 分配数据
   * @returns 操作结果
   */
  assignUsers: (data: { propertyCompanyId: number; userIds: number[] }) => {
    return api.post<ApiResponse<string>>(`/api/property/companies/${data.propertyCompanyId}/assign-users`, data.userIds)
  },

  /**
   * 取消物业公司用户分配
   * @param data 取消分配数据
   * @returns 操作结果
   */
  unassignUsers: (data: { propertyCompanyId: number; userIds: number[] }) => {
    return api.delete<ApiResponse<string>>(`/api/property/companies/${data.propertyCompanyId}/users`, { data: data.userIds })
  },

  /**
   * 获取物业公司已分配的用户列表
   * @param propertyCompanyId 物业公司ID
   * @returns 用户列表
   */
  getAssignedUsers: (propertyCompanyId: number) => {
    return api.get<ApiResponse<any[]>>(`/api/property/companies/${propertyCompanyId}/assigned-users`)
  },

  /**
   * 获取物业公司用户列表
   * @param propertyCompanyId 物业公司ID
   * @param params 查询参数（分页等）
   * @returns 用户列表
   */
  getPropertyCompanyUsers: (propertyCompanyId: number, params: any) => {
    return api.get<ApiResponse<any>>(`/api/user/property-company/${propertyCompanyId}/users`, { params })
  },

  /**
   * 新增物业用户
   * @param data 用户信息
   * @returns 操作结果
   */
  addPropertyUser: (data: any) => {
    return api.post<ApiResponse<null>>('/api/user/property-company/add', data)
  },

  /**
   * 启用用户
   * @param userId 用户ID
   * @returns 操作结果
   */
  enableUser: (userId: number) => {
    return api.put<ApiResponse<null>>(`/api/user/property-company/users/${userId}/enable`)
  },

  /**
   * 禁用用户
   * @param userId 用户ID
   * @returns 操作结果
   */
  disableUser: (userId: number) => {
    return api.put<ApiResponse<null>>(`/api/user/property-company/users/${userId}/disable`)
  },

  /**
   * 重置用户密码
   * @param userId 用户ID
   * @returns 操作结果
   */
  resetUserPassword: (userId: number) => {
    return api.put<ApiResponse<null>>(`/api/user/property-company/users/${userId}/reset-password`)
  },

  /**
   * 获取物业公司详情
   * @param id 物业公司ID
   * @returns 物业公司详情
   */
  getPropertyCompanyDetail: (id: number) => {
    return api.get<PropertyCompanyDetailResponse>(`/api/property/companies/${id}`)
  },

  /**
    * 根据小区ID获取物业公司ID
 * @param communityId 小区ID
   * @returns 物业公司ID
   */
  getPropertyCompanyIdByCommunityId: (communityId: number) => {
    return api.get<ApiResponse<number>>(`/api/region/property-community/property-company-by-community/${communityId}`)
  }
}

export default propertyCompanyApi 